# プロジェクト4 サーボ制御 ![](media/image-20250908152354194.png) **概要** サーボモーターは位置制御型の回転アクチュエーターです。主にハウジング、回路基板、コアレスモーター、ギア、および位置センサーで構成されています。その動作原理は、サーボがマイコンや受信機から送られた信号を受け取り、周期20ms・パルス幅1.5msの基準信号を生成し、取得したDCバイアス電圧とポテンショメーターの電圧を比較して電圧差を出力するというものです。 モーターの速度が一定の場合、ポテンショメーターはカスケード減速ギアを介して回転駆動され、電圧差が0になるとモーターは回転を停止します。一般的に、サーボの回転角度範囲は0°〜180°です。 サーボモーターの回転角度は、PWM(パルス幅変調)信号のデューティサイクルを調整することで制御されます。PWM信号の標準周期は20ms(50Hz)です。理論上、パルス幅は1ms〜2msの間で分布しますが、実際には0.5ms〜2.5msの範囲となります。このパルス幅が0°〜180°の回転角度に対応しています。ただし、メーカーの異なるモーターでは、同じ信号でも異なる回転角度になる場合があります。 ![](media/image-20250908152510007.png) 一般的に、サーボには茶色、赤色、オレンジ色の3本の線があります。茶色の線はGND(アース)、赤色の線は電源(プラス極)、オレンジ色の線は信号線です。 ![](media/image-20250908152525491.png) サーボの対応角度を以下に示します: ![](media/image-20250908152558682.png) **仕様** - 動作電圧:DC 4.8V 〜 6V - 動作角度範囲:約180°(500 → 2500 μsec時) - パルス幅範囲:500 → 2500 μsec - 無負荷速度:0.12 ± 0.01 sec / 60(DC 4.8V) 0.1 ± 0.01 sec / 60(DC 6V) - 無負荷電流:200 ± 20mA(DC 4.8V) 220 ± 20mA(DC 6V) - 停止トルク:1.3 ± 0.01kg・cm(DC 4.8V) 1.5 ± 0.1kg・cm(DC 6V) - 停止電流:≦ 850mA(DC 4.8V) ≦ 1000mA(DC 6V) - 待機電流:3 ± 1mA(DC 4.8V) 4 ± 1mA(DC 6V) **使用部品** ![](media/image-20250908152809268.png) **接続図:** ![](media/image-20250908152824930.png)**配線上の注意:** サーボの茶色の線をGnd(G)に、赤色の線を5v(V)に、オレンジ色の線をデジタルピン9に接続してください。 サーボは駆動電流の需要が高いため、外部電源に接続する必要があります。一般的に、開発ボードの電流では不足します。電源を接続しない場合、開発ボードが破損する恐れがあります。 **テストコード1** ```c /* keyestudio Mini Tank Robot V2.1 lesson 4.1 Servo http://www.keyestudio.com */ #define servoPin 9 //サーボのピン番号 int pos; //サーボの角度変数 int pulsewidth; // サーボのパルス幅変数 void setup() { pinMode(servoPin, OUTPUT); //サーボピンを出力に設定 procedure(0); //サーボの角度を0°に設定 } void loop() { for (pos = 0; pos <= 180; pos += 1) // 0度から180度まで動かす { // 1度ずつステップ procedure(pos); // 変数'pos'の位置にサーボを移動させる delay(15); //サーボの回転速度を制御する } for (pos = 180; pos >= 0; pos -= 1) // 180度から0度まで動かす { procedure(pos); // 変数'pos'の位置にサーボを移動させる delay(15); } } // サーボを制御する関数 void procedure(int myangle) { pulsewidth = myangle * 11 + 500; //パルス幅の値を計算する digitalWrite(servoPin,HIGH); delayMicroseconds(pulsewidth); //ハイレベルの持続時間がパルス幅となる digitalWrite(servoPin,LOW); delay((20 - pulsewidth / 1000)); // 周期は20ms、残りの時間はローレベルが続く } ``` コードのアップロードが完了すると、サーボは0°〜180°の範囲で往復動作します。 ```c /* keyestudio Mini Tank Robot V2.1 lesson 4.2 servo http://www.keyestudio.com */ #include Servo myservo; // サーボを制御するサーボオブジェクトを作成する // ほとんどのボードで最大12個のサーボオブジェクトを作成できる int pos = 0; // サーボの位置を格納する変数 void setup() { myservo.attach(9); // ピン9のサーボをサーボオブジェクトに割り当てる } void loop() { for (pos = 0; pos <= 180; pos += 1) // 0度から180度まで動かす { // 1度ずつステップ myservo.write(pos); // 変数'pos'の位置にサーボを移動させる delay(15); // サーボが位置に到達するまで15ms待機する } for (pos = 180; pos >= 0; pos -= 1) { // 180度から0度まで動かす myservo.write(pos); // 変数'pos'の位置にサーボを移動させる delay(15); // サーボが位置に到達するまで15ms待機する } } ``` **テスト結果** コードのアップロードが完了し、電源を入れると、サーボは0°〜180°の範囲で往復動作します。 結果は同じです。通常はライブラリファイルを使用して制御します。 **コードの説明** Arduinoには **\#include \**(サーボ関数と命令文)が付属しています。 以下はサーボ関数のよく使われる命令文です: 1. attach(インターフェース)——サーボのインターフェースを設定します。ポート9および10が使用可能です。 2. write(角度)——サーボの回転角度を設定する命令文です。 3. read()——サーボの角度を読み取る命令文で、「write()」のコマンド値を読み取ります。 4. **注意:** 上記の記述形式は「サーボ変数名.具体的な命令文()」となります。例:myservo.attach(9)